import axios from 'axios';
import { Message } from 'element-ui';
import store from '../store';
import { refreshToken } from '@/api/login';
import { getRefreshToken } from '@/utils/auth';
import { getToken } from '@/utils/auth';
// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 60000, // 请求超时时间
});
// request拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = 'bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config;
  },
  error => {
    // Do something with request error
    console.log(error); // for debug
    Promise.reject(error);
  }
);

// respone拦截器
service.interceptors.response.use(
  response => {
    const res = response.data;
    // 业务失败，需要跳转到404页面
    // if (!('access_token' in res)) {
    if (res.statusCode === 500) {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000,
      });
      return Promise.reject('error');
    }

    if (res.errorCode && res.errorCode !== 'SUCCESS') {
      Message({
        message:
          '服务器好像出了点问题。错误代码：' +
          res.errorCode +
          ' 错误信息：' +
          res.errorMessage,
        type: 'error',
        duration: 5 * 1000,
      });
      return Promise.reject('error');
    }
    return response;
  },
  async error => {
    console.log('service error:', error);
    const originalRequest = error.config;
    const refreshTokenNo = getRefreshToken();
    // oauth超时，需要刷新token
    if (
      refreshTokenNo &&
      error.response &&
      error.response.data.error !== 'unauthorized'
    ) {
      switch (error.response.status) {
        case 401: {
          // 判断是否已经刷新过token
          if (!error.config.isRetryRequest) {
            try {
              const response = await refreshToken(store.getters.refreshToken);
              error.config.isRetryRequest = true;
              const data = response.data;
              // var strs = new Array()
              // strs = data.split('&')
              // strs = strs[0].split('=')
              // await store.dispatch('RefreshStoreToken', strs[1])
              /* -----用户名密码登录 begin----- */
              await store.dispatch('RefreshStoreToken', data.access_token);
              /* -----用户名密码登录 end----- */
              return service(originalRequest);
            } catch (e) {
              // 刷新token失败只能跳转到登录页重新登录
              Message({
                message: '好久没有过来了吧，请重新登录一下吧。',
                type: 'error',
                duration: 1 * 1000,
              });
              store.dispatch('FedLogOut').then(() => {
                location.reload(); // 为了重新实例化vue-router对象 避免bug
              });
              return Promise.reject(error);
            }
            // refreshToken(store.getters.refreshToken).then(response => {
            //   error.config.isRetryRequest = true
            //   const data = response.data
            //   store.dispatch('RefreshStoreToken', data.access_token).then(() => {
            //     return service(originalRequest)
            //   })
            //   // originalRequest.headers['Authorization'] = 'bearer ' + data.access_token // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
            // }).catch(function() {
            //   // 刷新token失败只能跳转到登录页重新登录
            //   Message({
            //     message: '好久没有过来了吧，请重新登录一下吧。',
            //     type: 'error',
            //     duration: 1 * 1000
            //   })
            //   store.dispatch('FedLogOut').then(() => {
            //     location.reload()// 为了重新实例化vue-router对象 避免bug
            //   })
            //   return Promise.reject(error)
            // })
          }
          break;
        }
        case 400: {
          let mes = '';
          if (error.response.data.error === 'invalid_grant') {
            mes = '好久没有过来了吧，请重新登录一下吧。';
          } else {
            mes = '服务器好像有了点小毛病，请再登录一下吧。';
          }
          Message({
            message: mes,
            type: 'error',
            duration: 5 * 1000,
          });
          // store.dispatch('FedLogOut').then(() => {
          //   location.reload()// 为了重新实例化vue-router对象 避免bug
          // })
          return Promise.reject(error);
        }
        default: {
          let mes = '';
          if (error.config.isRetryRequest) {
            mes = '好久没有过来了吧，请重新登录一下吧。';
          } else {
            mes = '服务器好像有了点小毛病，请再登录一下吧。';
          }
          Message({
            message: mes,
            type: 'error',
            duration: 5 * 1000,
          });
          // store.dispatch('FedLogOut').then(() => {
          //   location.reload()// 为了重新实例化vue-router对象 避免bug
          // })
          return Promise.reject(error);
        }
      }
      // return service(originalRequest)
    } else {
      // if (getToken()) {
      //   Message({
      //     message: '服务器好像有了点小毛病，请再登录一下吧。',
      //     type: 'error',
      //     duration: 5 * 1000,
      //   });
      //   // store.dispatch('FedLogOut').then(() => {
      //   //   location.reload()// 为了重新实例化vue-router对象 避免bug
      //   // })
      // }
      // else {
      //   if (error.response.data.error === 'Bad Request') {
      //     Message({
      //       message: error.response.data.message,
      //       type: 'error',
      //       duration: 5 * 1000,
      //     });
      //   } else {
      //     Message({
      //       message: '用户名或密码错误',
      //       type: 'error',
      //       duration: 5 * 1000,
      //     });
      //   }
      // }
      return Promise.reject(error);
    }
  }
);

export default service;
